﻿#ifndef QRDEF_H
#define QRDEF_H

#define MAX_PARAMETER_LEN 32

#define PRODUCT_CODE_LENGTH 2
#define PRODUCT_SERIES_LENGTH 2
#define CONSUMABLES_CODE_LENGTH 1
#define SPECIFICATIONS_LENGTH 1
#define PRODUCTIONDATE_LENGTH 8
#define VALIDITY_PERIOD_LENGTH 2
#define BATCH_NUMBER_LENGTH 3
#define SERIAL_CODE_LENGTH 4

#define PLAIN_CODE_LENGTH 24
#define CIPHERCODE_LENGTH 48
#define CHECK_SUM_LENGTH 1

#ifdef __cplusplus
extern "C" {
#endif

typedef struct
{
    // 产品代码
    char productCode[PRODUCT_CODE_LENGTH + 1];

    // 产品序号
    char productSeries[PRODUCT_SERIES_LENGTH + 1];

    // 耗材代码
    char consumablesCode[CONSUMABLES_CODE_LENGTH + 1];

    // 耗材规格
    char specifications[SPECIFICATIONS_LENGTH + 1];

    // 生产日期
    char productionDate[PRODUCTIONDATE_LENGTH + 1];

    // 有效值
    int validityMonths;

    // 批号
    int batchNumber;
    
    // 流水码
    int serialCode;

} QRMakeInput;

typedef struct
{
    // 流水码
    char serialCode[SERIAL_CODE_LENGTH + 1];

    // 明文条码
    char plainCode[PLAIN_CODE_LENGTH + 1];

    // 密文条码
    char cipherCode[CIPHERCODE_LENGTH + 1];

} QRMakeOutput;

typedef struct  
{
    // 48位密文条码
    char cipherCode[CIPHERCODE_LENGTH + 1];

    // 机器型号
    char productSeries[PRODUCT_SERIES_LENGTH + 1];

} QRCheckInput;

typedef struct
{
    // 耗材名称
    char name[MAX_PARAMETER_LEN];

    // 耗材型号
    char type[MAX_PARAMETER_LEN];

    // 耗材批号
    char batchNumber[MAX_PARAMETER_LEN];

    // 耗材流水码
    char serialCode[MAX_PARAMETER_LEN];

    // 耗材保质期
    char expirationDate[MAX_PARAMETER_LEN];

} QRCheckOutput;

typedef struct
{
    // 元数据版本号
    char version[MAX_PARAMETER_LEN];

    // 耗材型号列表
    char *typeList[MAX_PARAMETER_LEN];

    // 耗材型号列表长度
    int typeLength;

} QRMetaData;

typedef enum {
    // 有效
    None = 0,

    // 不支持的产品类型
    ProductCodeNotFound,

    // 不支持的产品序号
    ProductSeriesNotFound,

    // 不支持的耗材代码
    ConsumablesCodeNotFound,

    // 不支持的耗材规格
    ConsumablesSpecificationsNotFound,

    // 无效的生产日期
    ProductionDateInvalid,

    // 无效的有效值
    ValidityMonthsInvalid,

    // 无效的批号
    BatchNumberInvalid,

    // 无效的流水码
    SerialCodeInvalid,

    // 无效条码
    Invalid,

    // 已过期
    Expired,

    // 产品序号不匹配
    ProductCodeNotMatch,

} QRError;

#ifdef __cplusplus
}
#endif

#endif /* QRDEF_H */
